Pressidian
花园入口
笔记
项目
关于
实验室
GitHub
花园入口
笔记
项目
关于
实验室
GitHub

KNOWLEDGE PATHS

笔记库
当前位置
笔记库/前端/项目笔记/代达罗斯/数据流向

数据库迁移 Drizzle 迁移文件说明

2 分钟阅读 · Note

目录树 578 篇

            • 数据库迁移 Drizzle 迁移文件说明
            • Anatomy 的 DAO
            • Archetype的服务层
            • Archetype的DAO层
            • DAO&DTO
            • Zod Schema 模式
          • 项目待做
          • 性能优化
          • UI设计
      • 前端技术栈
    • 笔记目录
    • CLAUDE.md
    • Vue 组件与 Render 函数

关联笔记 6

↗Anatomy 的 DAO同一路径↗Archetype的服务层同一路径↗Archetype的DAO层同一路径↗DAO&DTO同一路径↗Zod Schema 模式同一路径↗「Feature」Introduce Crate as an independent metadata entity[ˈentəti] | 引入 Crate 作为独立元数据实体共同主题
  • 数据库迁移 Drizzle 迁移文件说明

数据库迁移 Drizzle 迁移文件说明


三个核心文件

每次运行 bun run db:generate 后,Drizzle Kit 会在 apps/app/drizzle/ 下生成三个文件:

文件位置作用
_journal.jsondrizzle/meta/迁移目录,记录所有迁移的序号、时间戳和标签
XXXX_snapshot.jsondrizzle/meta/Schema 快照,记录本次迁移后数据库的完整结构
XXXX_tag.sqldrizzle/实际可执行的 SQL 迁移脚本

1. _journal.json — 迁移日志

{
  "version": "7",
  "dialect": "postgresql",
  "entries": [
    {
      "idx": 6,
      "version": "7",
      "when": 1782377985932,
      "tag": "0006_friendly_pyro",
      "breakpoints": true
    }
  ]
}

各字段含义:

  • idx — 迁移序号,从 0 开始递增
  • version — journal 格式版本号
  • when — Unix 时间戳(毫秒),标记迁移创建时间
  • tag — 迁移标签名,对应同名的 .sql 和 _snapshot.json 文件。格式为 序号_随机形容词_随机名词,由 Drizzle Kit 自动生成,无业务语义
  • breakpoints — 标记为断点。Drizzle Kit 生成新迁移时,以最近的 breakpoint 为基准进行 diff

2. XXXX_snapshot.json — Schema 快照

记录迁移执行后数据库的完整结构,包含所有表、列、索引、外键、唯一约束、检查约束等元数据。

{
  "id": "8925096c-...",
  "prevId": "928723d8-...",
  "version": "7",
  "dialect": "postgresql",
  "tables": { /* 所有表的完整定义 */ },
  "enums": {},
  "schemas": {},
  "sequences": {},
  "roles": {},
  "policies": {},
  "views": {}
}

关键字段 id 和 prevId: 两者组成一条链,id 是当前快照的 UUID,prevId 指向上一个快照的 UUID。Drizzle Kit 通过此链验证迁移历史的连续性。

3. XXXX_tag.sql — SQL 迁移脚本

本次迁移要执行的 SQL DDL 语句。例如:

CREATE TABLE "crates" (
    "id"             text PRIMARY KEY,
    "name"           text UNIQUE NOT NULL,
    ...
);

增量迁移流程

你修改了 Drizzle schema 代码(packages/db-schema/src/tables/)
        ↓
bun run db:generate
        ↓
Drizzle Kit 读取最近的 snapshot(如 0006_snapshot.json)
        ↓
与你当前的 schema 代码做 diff
        ↓
生成增量 SQL(如 0007_xxx.sql)—— 只包含变更部分
        ↓
写入新的 snapshot(0007_snapshot.json)供下次 diff 使用
        ↓
在 _journal.json 中追加一条新 entry

类比

可以把这三个文件理解为一个版本控制系统的不同部分:

Drizzle 文件Git 类比
_journal.jsongit log --oneline
XXXX_snapshot.json某次 commit 后的完整文件树快照
XXXX_tag.sql某次 commit 的 diff / patch